package practica5.multicast;
import practica5.general.*;

import java.net.*;
import java.io.*;

/**
 * Aquesta classe implementa el client TCP.
 */
public class ClientMulticast {

    private static String nick;
    private static int canal;
    /**
     * @param args No li passem arguments.
     */
    public static void main(String[] args) {
        try {
            // Connectem amb el servidor
            System.out.println("Conenctant amb el servidor...");
            Socket s = new Socket(Comms.HOST,Comms.PORT_SERVIDOR);

            // Obtenim els BufferedReader i PrintWriter.
            BufferedReader entrada = new BufferedReader(new InputStreamReader(s.getInputStream()));
            PrintWriter sortida = new PrintWriter(s.getOutputStream(),true);

            // Li demanem al servidor la llista de canals.
            sortida.println("list");
            int num_canals = Integer.parseInt(entrada.readLine());
            System.out.println("Hi ha "+num_canals+" canals: ");
            String[] ip = new String[num_canals];
            int[] port = new int[num_canals];
            for(int i = 0; i < num_canals; i++){
                ip[i] = entrada.readLine();
                port[i] = Integer.parseInt(entrada.readLine());
                String nom = entrada.readLine();
                String desc = entrada.readLine();
                System.out.println(i+" - "+nom+" - "+desc);
            }
            s.close();

            System.out.println();
            System.out.print("Escull un canal [1,2...]: ");
            canal = Integer.parseInt(
                    new BufferedReader(new InputStreamReader(System.in)).readLine()
                    );
            System.out.println("Ha escollit: "+canal);
            System.out.print("Posa el teu nick: ");
            nick = new BufferedReader(new InputStreamReader(System.in)).readLine();

            // Un cop sabem la sala i el nick, tornem a connectar
            // Al servidor per a unir-nos a la sala.
            s = new Socket(Comms.HOST,Comms.PORT_SERVIDOR);
            entrada = new BufferedReader(new InputStreamReader(s.getInputStream()));
            sortida = new PrintWriter(s.getOutputStream(), true);

            sortida.println("join");
            sortida.println(canal);
            sortida.println(nick);

            int num_usuaris = Integer.parseInt(entrada.readLine());
            System.out.println("Hi ha "+num_usuaris+" usuari a n'aquest canal: ");
            for(int i = 0; i < num_usuaris-1; i++){
                System.out.print(entrada.readLine()+", ");
            }
            System.out.println(entrada.readLine()+".");
            s.close();

            // Creem el socket multicast i ens afegim al grup.
            MulticastSocket ss = new MulticastSocket(port[canal]);
            ss.joinGroup(InetAddress.getByName(ip[canal]));

            // Aquests dos threads s'encarregaran d'anar llegint l'entrada del
            // teclat i enviar els missatges, i rebre els missatges per
            // mostrar-los per pantalla.
            EntradaMulticast thread_entrada = new EntradaMulticast(ss);
            SortidaMulticast thread_sortida = new SortidaMulticast(ss,nick,InetAddress.getByName(ip[canal]),port[canal]);
            thread_entrada.start();
            thread_sortida.start();
        } catch (Exception e) { System.out.println(e);}
    }

    /**
     * El programa acabara quan l'usuari envie "final". Abans de cridar
     * el System.exit(); el thread SortidaMulticast ha de cridar aquesta
     * funcio que connecta al servidor per dir que es desconnecta de la sala.
     */
    public static void surtCanal(){
    	try{
    		Socket s = new Socket(Comms.HOST,Comms.PORT_SERVIDOR);
    		PrintWriter sortida = new PrintWriter(s.getOutputStream(), true);
    		sortida.println("quit");
    		sortida.println(canal);
    		sortida.println(nick);
    		s.close();
    	}catch(Exception E){E.printStackTrace();}

    }
}
